#ifndef __REGION_HPP__
#define __REGION_HPP__

#include <cstdint>
#include <cstring>

namespace PocketSurvival
{
    #define MAP_CHUNK_SIZE 8192

    /***********************************************************************************************************
     *      一个 地图区域(Region) 对应一个地图文件(Region x,x.dat)，一个地图区域内有256个 区块(TerrainChunk) ， 一个 区块 大小为 16*256*16
    ***********************************************************************************************************/
    struct Region
    {
    public:
        // 一个map文件使用到2M的缓存，这里记录了一个区域内的 256 个区块的压缩数据，每个压缩数据最大只能是8k，后面或许不够用，等到出问题了再做改动好了
        uint8_t regionChunk[256][MAP_CHUNK_SIZE];

        // 记录了每个区块压缩后的数据大小，用于解压和保存区域数据时节约硬盘空间
        uint16_t regionChunkSize[256];

        // 区域是否被改变，当该值为 true 时，后面释放区域时会将数据保存到 .dat 文件中
        bool isChange = false;
        
    public:
        /**
         * @brief 获取区块的压缩数据
         * @param x 坐标x,最大值为15
         * @param y 坐标y,最大值为15
         * @return 区块的压缩数据指针
         */
        inline uint8_t * getChunkBuff(uint8_t x, uint8_t y)
        {
            return getChunkBuff(x + 16 * y);
        }
        inline uint16_t getChunkSize(uint8_t x, uint8_t y)
        {
            return getChunkSize(x + 16 * y);
        }
        inline void setChunkSize(uint8_t x, uint8_t y, uint16_t size)
        {
            regionChunkSize[x + 16 * y] = size;
        }
        inline uint8_t * getChunkBuff(uint8_t pos)
        {
            return regionChunk[pos];
        }
        inline uint16_t getChunkSize(uint8_t pos)
        {
            return regionChunkSize[pos];
        }
        inline void clearAll()
        {
            memset(regionChunkSize, 0, sizeof(regionChunkSize));
        }
    };
} // namespace PocketSurvival

#endif
